package main

import (
	"bufio"
	"fmt"
	"github.com/spf13/cobra"
	"io/ioutil"
	"log"
	"os"
	"strings"
)

var (
	rootCmd = &cobra.Command{
		Use:   "play",
		Short: "成语接龙游戏工具",
		Long:  `这是一个用于进行成语接龙游戏的命令行工具。`,
	}

	gameCmd = &cobra.Command{
		Use:   "game",
		Short: "开始成语接龙游戏",
		Long:  `输入一个成语开始接龙游戏`,
		Run:   startGame,
	}

	addCmd = &cobra.Command{
		Use:   "add [idiom]",
		Short: "添加一个新的成语到成语库",
		Long:  `手动添加一个新的成语到成语库中，用于接龙游戏`,
		Args:  cobra.ExactArgs(1),
		Run:   addIdiom,
	}

	idiomsFile = "idioms.txt"
)

func init() {
	rootCmd.AddCommand(gameCmd, addCmd)
}

func main() {
	if err := rootCmd.Execute(); err != nil {
		log.Fatal(err)
	}
}

func loadIdioms() []string {
	content, err := ioutil.ReadFile(idiomsFile)
	if err != nil {
		log.Fatal("无法读取成语文件:", err)
	}
	return strings.Split(string(content), "\n")
}

func saveIdioms(idioms []string) {
	content := strings.Join(idioms, "\n")
	err := ioutil.WriteFile(idiomsFile, []byte(content), 0644)
	if err != nil {
		log.Fatal("无法保存成语到文件:", err)
	}
}

func startGame(cmd *cobra.Command, args []string) {
	scanner := bufio.NewScanner(os.Stdin)
	var currentIdiom string
	// 加载成语列表
	idioms := loadIdioms()
	// 游戏循环
	for {
		fmt.Print("用户输入成语: ")
		scanner.Scan()
		userInput := scanner.Text()

		// 检查用户输入是否为空或是否有效（这里只是简单检查非空）
		if userInput == "" {
			fmt.Println("请输入一个有效的成语！")
			continue
		}

		// 更新当前成语为用户输入的成语
		currentIdiom = userInput

		// 查找下一个成语
		lastChar := getLastChar(currentIdiom)
		nextIdiom := findNextIdiom(idioms, lastChar)

		// 如果没有找到下一个成语
		if nextIdiom == "" {
			fmt.Println("恭喜你取得胜利")
			fmt.Print("是否重新开始游戏？(yes/no): ")
			scanner.Scan()
			if strings.ToLower(scanner.Text()) != "yes" {
				fmt.Println("游戏结束，感谢参与！")
				break // 退出游戏循环
			}
			continue
		}

		fmt.Println("下一个:", nextIdiom)
	}
}

// 辅助函数：获取字符串的最后一个字符
func getLastChar(s string) string {
	if len(s) > 0 {
		runes := []rune(s)
		// 获取并返回最后一个 rune 的字符串表示
		return string(runes[len(runes)-1])
	}
	return ""
}

// 辅助函数：从成语列表中查找以下一个成语
func findNextIdiom(idioms []string, lastChar string) string {
	for _, idiom := range idioms {
		if strings.HasPrefix(idiom, lastChar) {
			return idiom
		}
	}
	return ""
}

func addIdiom(cmd *cobra.Command, args []string) {
	idiom := args[0]
	idioms := loadIdioms()

	for _, existingIdiom := range idioms {
		if idiom == existingIdiom {
			log.Printf("成语 '%s' 已存在。\n", idiom)
			return
		}
	}

	idioms = append(idioms, idiom)
	saveIdioms(idioms)
	log.Printf("成语 '%s' 添加成功。\n", idiom)
}
